package com.pro.weixin.service;

import java.io.Writer;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.pro.weixin.main.MenuManager;
import com.pro.weixin.pojo.AccessToken;
import com.pro.weixin.util.MessageUtil;
import com.pro.weixin.util.WeixinUtil;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver;

import net.sf.json.JSONObject;

import com.pro.meeting.bean.MeetingType;
import com.pro.meeting.bean.UserInfo;
import com.pro.meeting.bean.Users;
import com.pro.meeting.service.MeetingGrabService;
import com.pro.meeting.service.UserInfoService;
import com.pro.meeting.service.UsersService;
import com.pro.meeting.service.utils.DateUtils;
import com.pro.weixin.api.userInfo.UserInfoUtil;
import com.pro.weixin.bean.resp.Article;
import com.pro.weixin.bean.resp.MusicMessage;
import com.pro.weixin.bean.resp.NewsMessage;
import com.pro.weixin.bean.resp.TextMessage;

@Service
public class CoreService {
	@Autowired
	UserInfoUtil  userInfoUtil;
	@Autowired
	UsersService  usersService;
	@Autowired
	UserInfoService  userInfoService;
	@Autowired
	MeetingGrabService meetingGrabService;
	/**
	 * 处理微信发来的请求
	 * 
	 * @param request
	 * @return
	 */
	public String processRequest(HttpServletRequest request) {
		String respMessage = null;
		try {
			// 默认返回的文本消息内容
			String respContent = "请求处理异常，请稍候尝试！";

			// xml请求解析 调用消息工具类MessageUtil解析微信发来的xml格式的消息，解析的结果放在HashMap里；
			Map<String, String> requestMap = MessageUtil.parseXml(request);

			// 发送方帐号（open_id） 下面三行代码是： 从HashMap中取出消息中的字段；
			String fromUserName = requestMap.get("FromUserName");
			
			System.out.println("发送的帐户openid:"+fromUserName);
			// 公众帐号
			String toUserName = requestMap.get("ToUserName");
			// 消息类型
			String msgType = requestMap.get("MsgType");

			// 回复文本消息 组装要返回的文本消息对象；
			TextMessage textMessage = new TextMessage();
			textMessage.setToUserName(fromUserName);
			textMessage.setFromUserName(toUserName);
			textMessage.setCreateTime(new Date().getTime());
			textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);
			textMessage.setFuncFlag(0);
			// 由于href属性值必须用双引号引起，这与字符串本身的双引号冲突，所以要转义
			// textMessage.setContent("欢迎访问<a
			// href=\"http://www.baidu.com/index.php?tn=site888_pg\">百度</a>!");
			// 将文本消息对象转换成xml字符串
			respMessage = MessageUtil.textMessageToXml(textMessage);
			/**
			 * 演示了如何接收微信发送的各类型的消息，根据MsgType判断属于哪种类型的消息；
			 */

			// 接收用户发送的文本消息内容
			String content = requestMap.get("Content");

			// 创建图文消息
			NewsMessage newsMessage = new NewsMessage();
			newsMessage.setToUserName(fromUserName);
			newsMessage.setFromUserName(toUserName);
			newsMessage.setCreateTime(new Date().getTime());
			newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS);
			newsMessage.setFuncFlag(0);

			// 文本消息
			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				respContent = "您发送的是文本消息！";
			}
			// 图片消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
				respContent = "您发送的是图片消息！";
			}
			// 地理位置消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
				respContent = "您发送的是地理位置消息！";
			}
			// 链接消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
				respContent = "您发送的是链接消息！";
			}
			// 音频消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
				respContent = "您发送的是音频消息！";
			}
			// 事件推送
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
				// 事件类型
				String eventType = requestMap.get("Event");
				// 订阅
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					//收集微信用户信息 ：业务方法
					userInfoUtil.coreService(fromUserName);
					
					
					respContent = "欢迎关注微信公众号";
				}
				// 取消订阅
				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					//和数据库wei_users数据完成同步
					userInfoUtil.unSubscribe(fromUserName);
					
					// TODO 取消订阅后用户再收不到公众号发送的消息，因此不需要回复消息
				}
				// 自定义菜单点击事件
				else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
					// 事件KEY值，与创建自定义菜单时指定的KEY值对应
					String eventKey = requestMap.get("EventKey");

					
					
				
					//会议抢单按钮事件
					if (eventKey.equals("11")) {

						//单图文
						List<Article> articleList = new ArrayList<Article>();
						
						//会议抢单 事件逻辑方法
						Article article=meetingGradService(fromUserName);
						
						articleList.add(article);
						// 设置图文消息个数
						newsMessage.setArticleCount(articleList.size());
						// 设置图文消息
						newsMessage.setArticles(articleList);
						// 将图文消息对象转换为XML字符串
						respMessage = MessageUtil.newsMessageToXml(newsMessage);
						return respMessage;
						
					}//每日日报 
					else if (eventKey.equals("21")) {
						String currtTime=DateUtils.getMonthAndDay();//今日月/日
						String yestTime=DateUtils.getYestMonthAndDay();//昨日
						
						//昨日发单数量
						int yPcount=meetingGrabService.readYestPubCount();
						//可抢单数量（按类别分类显示）
						List<MeetingType> listType=meetingGrabService.readPubGrabCount();
						int sumGrab=0;//可抢单总数
						StringBuffer grabCountStr=new StringBuffer();
						for(MeetingType type:listType){
							sumGrab+=type.getTid();
							grabCountStr.append(type.getTitle()+"可抢单:  "+type.getTid()+"场\n");
						}
						//昨天成功匹配数量
						int yEquCount=meetingGrabService.readYestEquCount();
						//昨天成功执行（召开）数量
						int yExecCount=meetingGrabService.readYestExecCount();
						
						StringBuffer str=new StringBuffer();
						str.append("每日日报(今日"+currtTime+"日) \n");
						str.append("1、昨天("+yestTime+")发单数量"+yPcount+"场 \n");
						str.append("2、今日可抢单数量"+sumGrab+"场\n");
						str.append(grabCountStr);
						str.append("3、总结\n");
						str.append("昨天成功匹配"+yEquCount+"场\n");
						str.append("昨天成功执行"+yExecCount+"场\n");
						
						respContent=str.toString();
					}
					
					//版本消息
					else if(eventKey.equals("31")){
						/*Version 1.0
						 * 2018-1-3微信服务号成立
						 * 2-1日增加微信用户登录绑定功能
						 * 2-2日完成个人信息修改功能
						 */
						StringBuffer str=new StringBuffer();
						
						str.append("Version 1.0\n");
						str.append("2018-1-3微信服务号成立\n");
						str.append("2-1日增加微信用户登录绑定功能\n");
						str.append("2-2日完成个人信息修改功能\n");
						str.append("2-2日完成发单\n");
						respContent=str.toString();
						
					}
					//联系我们 图文消息 
					else if(eventKey.equals("33")){
						//单图文
						List<Article> articleList = new ArrayList<Article>();
						// 单图文消息
						Article article = new Article();
						article.setTitle("习近平建设现代化经济");
						article.setDescription("国家统计局最新数据显示，2017年，我国规模以上工业企业实现利润75187.1亿元，比上年增长21%，增速比2016年提高12.5个百分点，是2012年以来增速最高的一年。从盈利能力看，2017年，规模以上工业企业主营业务收入利润率为6.46%，比上年提高0.54个百分点，工业企业盈利能力明显增强。建设现代化经济体系就必须抓住发展实体经济这个“牛鼻子”，推动形成全面开放新格局，早日实现产业强国的梦想。以“强”为要 擘画现代化强国");
						article.setPicUrl("http://n.sinaimg.cn/news/crawl/w550h423/20180204/jkDU-fyrhcqy3897859.jpg");
						article.setUrl("http://news.sina.com.cn/china/xlxw/2018-02-04/doc-ifyrhcqy3898673.shtml");
						
						
						Article article1 = new Article();
						article1.setTitle("java1704班级--大事件");
						article1.setDescription("班级状态：男生29，女生4人。详情请参考班内最新动态");
						article1.setPicUrl("http://img2.imgtn.bdimg.com/it/u=1110072184,3772858154&fm=27&gp=0.jpg");
						article1.setUrl(MenuManager.REAL_URL+"index.jsp");
						
						
						
						articleList.add(article);	
						articleList.add(article1);
						// 设置图文消息个数
						newsMessage.setArticleCount(articleList.size());
						// 设置图文消息
						newsMessage.setArticles(articleList);
						// 将图文消息对象转换为XML字符串
						respMessage = MessageUtil.newsMessageToXml(newsMessage);
						return respMessage;
					}
					else if (eventKey.equals("70")) {

						List<Article> articleList = new ArrayList<Article>();
						
						// 单图文消息
						Article article = new Article();
						article.setTitle("标题");
						article.setDescription("描述内容");
						article.setPicUrl(
								"图片");
						article.setUrl("跳转连接");

						
						articleList.add(article);						
						// 设置图文消息个数
						newsMessage.setArticleCount(articleList.size());
						// 设置图文消息
						newsMessage.setArticles(articleList);
						// 将图文消息对象转换为XML字符串
						respMessage = MessageUtil.newsMessageToXml(newsMessage);
						return respMessage;
					}
					
				}

			}

			// 组装要返回的文本消息对象；
			textMessage.setContent(respContent);
			// 调用消息工具类MessageUtil将要返回的文本消息对象TextMessage转化成xml格式的字符串；
			respMessage = MessageUtil.textMessageToXml(textMessage);

		} catch (Exception e) {
			e.printStackTrace();
		}

		return respMessage;
	}

	
	//##########TODO 会议抢单 事件逻辑方法
	public Article  meetingGradService(String fromUserName){
		// 单图文消息
		Article article = new Article();											
		
		//根据opendid查询用户是否进行绑定（wei_users表 openid-->Users表wid
		UserInfo userInfo=userInfoService.getByOpenid(fromUserName);
		Users users=usersService.getByOpenid(fromUserName);
		if(users==null){//未绑定
			article.setTitle("您当前无权限操作，请点击登录");
			article.setDescription("当前系统针对内部数据，您需要到登录页面完成绑定才能操作相应功能。点击进入登录页面");
			article.setPicUrl("https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1853014024,2371232621&fm=27&gp=0.jpg");
			article.setUrl(MenuManager.REAL_URL+"pages/weixin/login.jsp?wid="+userInfo.getWid());
			
		}else{//绑定
			if(1==users.getRid()){ //发单组
				article.setTitle(users.getName()+",您当前是发单组，仅能查看相关信息数据");
				article.setDescription("本系统中，发单组用户仅能查看抢单会议列表数据。");
				article.setPicUrl("https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=230381550,1895951590&fm=27&gp=0.jpg");
			}
			else if(2==users.getRid()){ //抢单组
				article.setTitle(users.getName()+",欢迎，进行抢单匹配吧~");
				article.setDescription("如何抢单、抢单教程等。");
				article.setPicUrl("https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3251627250,1520816644&fm=27&gp=0.jpg");
			}
			article.setUrl(MenuManager.REAL_URL+"pages/weixin/meetingGrab/meetingGrab_list.jsp?uid="+users.getUid()+"&rid="+users.getRid());
			
		}
		return article;
	}
	
}
